package com.co.notaweb.beans;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.event.PhaseId;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;

import com.co.notaweb.constantes.ConstantesMsg;
import com.co.notaweb.entities.Asignacion;
import com.co.notaweb.entities.Calificacion;
import com.co.notaweb.entities.Curso;
import com.co.notaweb.entities.Docente;
import com.co.notaweb.entities.Logro;
import com.co.notaweb.entities.Materia;
import com.co.notaweb.entities.Periodo;
import com.co.notaweb.entities.Persona;
import com.co.notaweb.facade.IColegioFacadeLocal;
import com.co.notaweb.facade.system.ISistemaFacadeLocal;
import com.co.notaweb.util.Constants;
import com.co.notaweb.util.FacesUtils;
import com.co.notaweb.util.SelectUtil;
import com.co.notaweb.util.ServiceLocator;

/**
 * @author PC
 * @version 1.0
 * @created 13-nov-2011 12:14:26
 */
public class IngresoLogroBean {
	private IColegioFacadeLocal colegioFacade;
	private ISistemaFacadeLocal sistemaFacade;
	private Calificacion calificacion;
	private long curso;
	private List<SelectItem> listaColegios;
	private List<SelectItem> listaCursos;
	private List<SelectItem> listaMaterias;
	private List<SelectItem> listaPeriodos;
	private Asignacion asignacion;
	private List<Logro> logros;
	private long materia;
	private long colegio;
	private long periodo;
	private Docente docente;
	private Logro logro;
	private boolean verCrearLogro = false;



	private Persona persona;

	/**
	 * logrobean
	 * 
	 * @return
	 */

	@PostConstruct
	private void init() {
		try {
			colegioFacade = (IColegioFacadeLocal) new ServiceLocator()
					.getServiceLocal(Constants.FACADECOLEGIO);
			sistemaFacade = (ISistemaFacadeLocal) new ServiceLocator()
					.getServiceLocal(Constants.FACADESISTEMA);

			persona = FacesUtils.getPersona();

			docente = (Docente) persona;
//			colegio = 1L;

			listaColegios = SelectUtil.buildColegiosItems(colegioFacade
					.consultarColegiosByDocente(docente.getId()));
			

			listaCursos = SelectUtil.buildCursosItems(new ArrayList<Curso>());

			listaMaterias = SelectUtil
					.buildMateriasItems(new ArrayList<Materia>());

			listaPeriodos = SelectUtil
					.buildPeriodosItems(new ArrayList<Periodo>());

			limpiarForm();
		} catch (Exception e) {
			FacesUtils.addErrorMessageBundle(ConstantesMsg.COMMON_ERROR);
			e.printStackTrace();
		}
	}

	private void limpiarForm() {
		logros = new ArrayList<Logro>();
		logro = new Logro();
	}

	/**
	 ******************************************************************************************************************** 
	 * Actions
	 ******************************************************************************************************************** 
	 */

	public String finalizar() {

		return "iraMenu";
	}

	/**
	 * logrobean
	 * 
	 * @return
	 */

	public void showCrearLogro() {
		if (periodo > 0) {
			verCrearLogro = true;
		} else {
			FacesUtils
					.addErrorMessage("Debe seleccionar el curso, la materia y el periodo para crear logros");
		}

	}

	public String saveLogro() {

		try {
			Periodo periodoEntity = colegioFacade.findPeriodo(periodo);
			logro.setAsignacion(asignacion);
			logro.setPeriodo(periodoEntity);
			colegioFacade.createLogro(logro,periodoEntity,asignacion);

			limpiarForm();
			logros = colegioFacade
					.consultarLogrosPorCursoDocenteMateriaPeriodo(curso,
							docente.getId(), materia, periodo);
			FacesUtils.addSuccesMessage("El logro fue creado correctamente");
		} catch (Exception e) {
			FacesUtils.addErrorMessage("El logro no fue creado. "
					+ e.getMessage());
			e.printStackTrace();
		}
		return "";
	}

	/**
	 ******************************************************************************************************************** 
	 * Event Listners
	 ******************************************************************************************************************** 
	 */

	public void selectColegioListener(ValueChangeEvent event) {
		if (event.getPhaseId() != PhaseId.INVOKE_APPLICATION) {
			event.setPhaseId(PhaseId.INVOKE_APPLICATION);
			event.queue();
		}
		try {
			if (colegio != 0) {
				listaCursos = SelectUtil.buildCursosItems(colegioFacade
						.consultarCursosPorDocente(docente.getId()));		
			}
		} catch (Exception e) {
			FacesUtils.addErrorMessageBundle(ConstantesMsg.COMMON_ERROR);
			e.printStackTrace();
		}
	}

	
	
	public void selectCursoListener(ValueChangeEvent event) {
		if (event.getPhaseId() != PhaseId.INVOKE_APPLICATION) {
			event.setPhaseId(PhaseId.INVOKE_APPLICATION);
			event.queue();
		}
		try {
			if (curso != 0) {
				listaMaterias = SelectUtil.buildMateriasItems(colegioFacade
						.consultarMateriasPorCursoDocente(curso,
								docente.getId()));
			}
		} catch (Exception e) {
			FacesUtils.addErrorMessageBundle(ConstantesMsg.COMMON_ERROR);
			e.printStackTrace();
		}
	}

	public void selectMateriaListener(ValueChangeEvent event) {
		if (event.getPhaseId() != PhaseId.INVOKE_APPLICATION) {
			event.setPhaseId(PhaseId.INVOKE_APPLICATION);
			event.queue();
		}
		try {
			if (materia != 0) {
				listaPeriodos = SelectUtil.buildPeriodosItems(colegioFacade
						.consultarPeriodosColegio(colegio));

			}
		} catch (Exception e) {
			FacesUtils.addErrorMessageBundle(ConstantesMsg.COMMON_ERROR);
			e.printStackTrace();
		}

	}

	public void selectPeriodoListener(ValueChangeEvent event) {
		try {
			if (event.getPhaseId() != PhaseId.INVOKE_APPLICATION) {
				event.setPhaseId(PhaseId.INVOKE_APPLICATION);
				event.queue();
				return;
			}

			if (periodo != 0) {
				logros = colegioFacade
						.consultarLogrosPorCursoDocenteMateriaPeriodo(curso,
								docente.getId(), materia, periodo);
				asignacion = colegioFacade
						.consultarAsignacionPorCursoDocenteMateria(curso,
								docente.getId(), materia);
			}
		} catch (Exception e) {
			FacesUtils.addErrorMessageBundle(ConstantesMsg.COMMON_ERROR);
			e.printStackTrace();
		}

	}

	/**
	 ******************************************************************************************************************** 
	 * Getters And Setters
	 ******************************************************************************************************************** 
	 */

	public Calificacion getCalificacion() {
		return calificacion;
	}

	public void setCalificacion(Calificacion calificacion) {
		this.calificacion = calificacion;
	}

	public long getCurso() {
		return curso;
	}

	public void setCurso(long curso) {
		this.curso = curso;
	}

	public List<SelectItem> getListaColegios() {
		return listaColegios;
	}

	public List<SelectItem> getListaCursos() {
		return listaCursos;
	}

	public List<SelectItem> getListaMaterias() {
		return listaMaterias;
	}

	public List<SelectItem> getListaPeriodos() {
		return listaPeriodos;
	}

	public List<Logro> getLogros() {
		return logros;
	}

	public void setLogros(List<Logro> logros) {
		this.logros = logros;
	}

	public long getMateria() {
		return materia;
	}

	public void setMateria(long materia) {
		this.materia = materia;
	}

	public Logro getLogro() {
		return logro;
	}

	public void setLogro(Logro logro) {
		this.logro = logro;
	}

	public long getColegio() {
		return colegio;
	}

	public void setColegio(long colegio) {
		this.colegio = colegio;
	}

	public long getPeriodo() {
		return periodo;
	}

	public void setPeriodo(long periodo) {
		this.periodo = periodo;
	}

	public boolean isVerCrearLogro() {
		return verCrearLogro;
	}

	public void setVerCrearLogro(boolean verCrearLogro) {
		this.verCrearLogro = verCrearLogro;
	}

}